// const obj = { label: '男', value: 1, age: 20 }

// console.log(Object.values(obj))
// console.log(Object.keys(obj))

// -------- Object.keys()
// 参数：要返回其枚举自身属性的对象
// 返回值：一个表示给定对象的所有可枚举属性的字符串数组
// 1. 处理对象，返回可枚举的属性数组

// const person = {
//   name: '张三',
//   age: 25,
//   address: '深圳',
//   getName: function() { }
// }
// console.log(Object.keys(person)) // [ 'name', 'age', 'address', 'getName' ]

// 2. 处理数组，返回索引值数组
// const arr = [1, 2, 3, 4, 5, 6]
// console.log(Object.keys(arr)) // ["0", "1", "2", "3", "4", "5"]

// 3. 处理字符串，返回索引值数组
// const str = 'ikun你好'
// console.log(Object.keys(str)) // ["0", "1", "2", "3", "4", "5"]

// 4. 常用技巧
// const person = { name: '张三', age: 25, address: '深圳', getName: function() {} }
// Object.keys(person).map((key) => {
//   console.log(person[key]) // 获取到属性对应的值，做一些处理
// })

// -----------------------------  Object.values()

// 1. 返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历属性的键值
// const obj = {
//   foo: 'bar',
//   baz: 20
// }
// console.log(Object.values(obj)) // ["bar", 20]

// 2. 返回数组的成员顺序，与属性的遍历部分介绍的排列规则一致
// const obj = { 100: 'a', 2: 'b', 7: 'c' }
// console.log(Object.values(obj)) // ["b", "c", "a"]

// 属性名为数值的属性，是按照数值大小，从小到大遍历的，因此返回的顺序是b、c、a。

// 3. Object.values()只会遍历对象自身的可遍历属性
// const obj = Object.create({}, { p: { value: 10 }})
// console.log(Object.values(obj))
// console.log(Object.getOwnPropertyDescriptors(obj))

// 4. 如果参数不是对象，Object.values会先将其转为对象
// console.log(Object.values(42)) // []
// console.log(Object.values(true)) // []
// console.log(Object.values(undefined)) // error
// console.log(Object.values(null)) // error

// 由于数值和布尔值的包装对象，都不会为实例添加非继承的属性，因此Object.values会返回空数组。

//  ----------------  Object.entries()
// 1. Object.entries方法返回一个数组，成员是参数对象自身的（不含继承的）所有可遍历（enumerable）属性的键值对数组
// var obj = { foo: 'bar', baz: 42 }
// console.log(Object.entries(obj)) // [ [ 'foo', 'bar' ], [ 'baz', 42 ] ]

// 2. 如果原对象的属性名是一个 Symbol 值，该属性会被省略

// 3. 遍历对象的属性
// const obj = {
//   one: 1,
//   two: 2
// }
// for (const [k, v] of Object.entries(obj)) {
//   console.log(`${JSON.stringify(k)} : ${JSON.stringify(v)}`)
// }

// "one" : 1
// "two" : 2

// 4. 将对象转为真正的Map结构
const obj = { foo: 'bar', baz: 10 }
const map = new Map(Object.entries(obj))
console.log(map) // Map(2) { 'foo' => 'bar', 'baz' => 10 }

// 展开运算符在对象中使用，只能用于对象合并或者对象的浅拷贝

